<?php

use core\Request;
use core\Url;
use core\Config;
use core\Session;
use core\Log;
use core\Clear;

if (!function_exists('json')) {
    /**
     * 助手函数 返回json
     * @param int $code 状态码
     * @param string $msg 提示
     * @param array $ary 数组数据
     * @return false|string
     */
    function json(int $code = 1, string $msg = 'ok', array $ary = [])
    {
        $data = [
            'code' => $code,
            'msg' => $msg,
            'data' => $ary
        ];
        return json_encode($data, JSON_UNESCAPED_UNICODE);
    }
}

if (!function_exists('jsonApi')) {
    /**
     * 助手函数 输出json
     * @param int $code 状态码
     * @param string $msg 提示
     * @param array $ary 数组数据
     * @return false|string
     */
    function jsonApi(int $code = 1, string $msg = 'ok', array $ary = []): string
    {
        header('Content-Type: text/html; charset=utf-8');
        header("Access-Control-Allow-Origin:*"); // 允许任意域名发起的跨域请求
        header('Access-Control-Allow-Headers:DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Typ');
        header('Access-Control-Allow-Methods:PUT,POST,GET,DELETE,OPTIONS');

        $data = [
            'code' => $code,
            'msg' => $msg,
            'data' => $ary
        ];
        echo json_encode($data, JSON_UNESCAPED_UNICODE);
        exit;
    }
}

if (!function_exists('redirect')) {
    /**
     * 助手函数 重定向
     * @param string|null $url
     * @return void
     */
    function redirect(string $url = null)
    {
        if ($url == null) {
            $url = '/';
        }
        $url = request()->domain() . url($url);

        header('content-type:text/html;charset=uft-8');
        header("Location:$url");
        exit;
    }
}

if (!function_exists('request')) {
    /**
     * 助手函数 获取当前Request对象实例
     * @return Request
     */
    function request()
    {
        return Request::instance();
    }
}

if (!function_exists('session')) {
    /**
     * 助手函数 获取或设置session
     * @param string $name
     * @param string $value
     * @param null $prefix
     * @return array|mixed|void|null
     */
    function session(string $name, string $value = '', $prefix = null)
    {
        if ($value == '') {
            return Session::get($name);
        } else {
            Session::set($name, $value, $prefix);
        }
    }
}

if (!function_exists('url')) {
    /**
     * 助手函数 Url生成
     * @param string $url 路由地址
     * @param string|array $vars 变量
     * @return string
     */
    function url(string $str = '', array $ary = []): string
    {
        return Url::create($str, $ary);
    }
}

if (!function_exists('config')) {
    /**
     * 助手函数 读取配置文件内容
     * @param string $name
     * @return null
     */
    function config(string $name)
    {
        if ($name) {
            return Config::get($name);
        }
        return null;
    }
}

if (!function_exists('model')) {
    /**
     * 助手函数 实例化Model
     * @param string $name Model名称
     * @return object
     * @throws Exception 异常
     */
    function model(string $name = ''): object
    {
        $class = '\\app\\model\\' . $name;

        if (class_exists($class)) {
            $model = new $class();
        } else {
            $module = request()->module();
            $class = "\\app\\" . $module . "\\model\\" . $name;
            if (class_exists($class)) {
                $model = new $class();
            } else {
                throw new Exception('The model class not exists:' . $class);
            }
        }
        return $model;
    }
}

if (!function_exists('setLog')) {
    /**
     * 助手函数 日志记录
     * @param string $content 日志内容
     * @param string $type 日志类型 log|error|info|sql|notice|alert|debug
     * @return void
     */
    function setLog(string $content, string $type = 'log')
    {
        Log::write($content, $type);
    }
}

if (!function_exists('clear')) {
    /**
     * 助手函数 清除缓存
     * @param string $type 类型 cache|log|views
     * @return void
     */
    function clear(string $type = 'all')
    {
        Clear::del($type);
    }
}

/**
 * 文件路径补全
 * @param string $name
 * @return string
 */
function fileRoutePatch(string $name): string
{
    $epr = '/';
    $name = ltrim($name, $epr);
    $name = rtrim($name, $epr);
    $strAry = explode($epr, $name);
    $strAryNum = count($strAry);

    if ($strAryNum == 1) {
        $intactFile = request()->module() . $epr . request()->controller() . $epr . $name;
    } elseif ($strAryNum == 2) {
        $intactFile = request()->module() . $epr . $name;
    } else {
        $intactFile = $name;
    }
    return $intactFile;
}

